#pragma once
#include <vector>
struct TreeNode
{
    TreeNode(int val)
        : _val(val),
          left(nullptr),
          right(nullptr)
    {
    }
    int _val;
    TreeNode *left;
    TreeNode *right;
};

class BinaryTree
{
public:
    BinaryTree() {};

    // 二叉树的节点总数
    int BinaryTreeNodeNum(TreeNode *root);
    // 构建二叉树
    void BuildBinaryTree(const std::vector<int> &source);
    //二叉树高度
    int BinaryTreeSize(TreeNode *root);

    // 二叉树叶子节点个数
    int BinaryTreeLeafSize(TreeNode* root);

    // 二叉树第k层节点个数
    int BinaryTreeLevelKSize(TreeNode* root, int k);

    // 二叉树查找值为x的节点
    TreeNode *BinaryTreeFind(TreeNode* root, int x);

    // 二叉树前序遍历
    void BinaryTreePrevOrder(TreeNode *root);

    // 二叉树中序遍历
    void BinaryTreeInOrder(TreeNode *root);

    // 二叉树后序遍历
    void BinaryTreePostOrder(TreeNode *root);

    // 层序遍历
    void BinaryTreeLevelOrder(TreeNode *root);

    // 判断二叉树是否是完全二叉树
    int BinaryTreeComplete();

    ~BinaryTree()
    {
    }

public:
    TreeNode *_root = nullptr;
};